package cn.itsource.consumer.queue;

import cn.itsource.utils.ConnectionUtil;
import com.rabbitmq.client.*;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @description: 消费者
 */
public class ConsumerTest2 {
    //队列名称
    public static final String QUEUE_HELLOWORD = "helloworld";

    /**
     * 步骤：
     * 1、创建连接
     * 2、创建信道
     * 3、监听队列
     * 4、处理消息
     */
    public static void main(String[] args) throws Exception {
//        //定义连接工厂
//        ConnectionFactory factory = new ConnectionFactory();
//        //设置服务地址
//        factory.setHost("localhost");
//        //1、创建连接，通过工厂获取连接
//        Connection connection = factory.newConnection();
        Connection connection = ConnectionUtil.getConnection();
        //2、创建信道
        Channel channel = connection.createChannel();
        //TODO 设置消费者每次从队列中，只能同时拿1个，消费完之后，再从队列中获取
        channel.basicQos(1);

        //3、监听队列(接收消息)
        //todo 如果使用手动ACK确认，那么在消费者参数2：autoAck 必须设置为  false
        channel.basicConsume(QUEUE_HELLOWORD, true, new DefaultConsumer(channel) {
            //4、处理消息
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
               /*
                    注意注意注意： 这个方法体，就是消费者进行 业务逻辑处理的入口
                */

                System.out.println(new SimpleDateFormat("HH:mm:ss").format(new Date())+"》》》》Consumer2》》》》》，收到消息：" + new String(body));
//                int i = 1 / 0;
//                //消费者标签
//                System.out.println("consumerTag=" + consumerTag);
//                //交换机
//                System.out.println("getExchange=" + envelope.getExchange());
//                //路由key
//                System.out.println("getRoutingKey=" + envelope.getRoutingKey());
//                //消息ID(生产者保存到mq时，mq自动生成的唯一的消息标识-类表中的主键)
//                System.out.println("getDeliveryTag=" + envelope.getDeliveryTag());

                //如果程序能走到方法的最后一行，说明：业务逻辑全部成功处理
                //于是：就在最后一行，添加一个  手动ACK确认的代码
//                channel.basicAck(envelope.getDeliveryTag(), false);


                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}